package com.bjsxt;
/**HashSet存储特征分析：Hashset是一个不保证元素的顺序且没有重复元素的集，是线程
 * 不安全的。Hashset允许有null元素*/
/*无序：在HashSet 中底层是使用HashSet存储元素的。HashMap底层使用的是 数组 与
链表实现元素的存储。元素在数组中存放时，并不是有序存放的也不是随机存放，而是对元素的
 哈希值进行运算决定元素在数组中的位置*/
/*不重复：当两个元素的哈希值（取模运算）进行运算后得到相同的在数组中的位置时，会调用元素
* 的equals()方法判断两个元素是否相同，如果元素相同则不会添加该元素，如果不相同则会
* 使用 单向链表 保存该元素*/
import java.util.HashSet;
import java.util.Set;

public class TestHashSet {
    public static void main(String[] args) {
        //实例化
        //接口                   实现类
        Set<String> set = new HashSet<>();
        //添加元素
        set.add("a");
        set.add("b");
        set.add("c");
        set.add("a");
        //获取元素
        /*HashSet没有索引，所以没有对应的get(int index)  只可以用for-each*/
        for (String str:set){
            System.out.println(str); //abc
        }
        System.out.println("-----删除元素-----");
        boolean flag = set.remove("b");
        System.out.println(flag);
        for(String str:set){
            System.out.println(str);
        }
        System.out.println("----------元素的个数---");
        int size = set.size();
        System.out.println(size);


        System.out.println("-------存储自定义对象 （user类）-------");
        //实例化
        Set<User> set1 = new HashSet<>();
        User u = new User("aa",18);
        User u1 = new User("aa",18);
        //将元素添加到容器里
        set1.add(u);
        set1.add(u1);
        //两个hasCode()的数值不同，所以都打印出来，
        /*System.out.println(u.hashCode());
        System.out.println(u1.hashCode());
        for (User user:set1){
            System.out.println(user);
        }*/
        //在User类中从写hashcode与equal() ,这样哈希值不同
        System.out.println(u.hashCode());
        System.out.println(u1.hashCode());
        for (User user:set1){
            System.out.println(user);
        }
    }
}
